// 文件名：string_view_log_parse.cpp
// 目的：用 string_view 对日志行进行零拷贝切分，解析为 {timestamp, level, message} 三段。
// 方法：
//   - 维护对整行的 string_view line，通过一个闭包 nextField(delim) 查找分隔符、返回分隔前的字段视图，
//     同时对 line 调用 remove_prefix 将其推进到下一个字段起点；
//   - 最终 message 直接为剩余的 line（可能包含空格）。
// 生命周期：
//   - 返回的 LogEntry 中 string_view 成员仅引用原始字符串 raw 的内存，必须保证 raw 在使用期间有效；
//   - 本示例中 raw 的生命周期覆盖 entry 的使用，安全无悬垂引用。
// 复杂度：O(L)，L 为行长度（每个字符只扫描有限次）。

#include <iostream>
#include <string>
#include <string_view>

struct LogEntry {
    std::string_view timestamp;
    std::string_view level;
    std::string_view message;
};

LogEntry parseLogLine(std::string_view line) {
    auto nextField = [&](char delim) {
        std::size_t pos = line.find(delim);
        std::string_view field = line.substr(0, pos);
        if (pos == std::string_view::npos) {
            line.remove_prefix(line.size());
        } else {
            line.remove_prefix(pos + 1);
        }
        return field;
    };

    LogEntry entry;
    entry.timestamp = nextField(' ');
    entry.level     = nextField(' ');
    entry.message   = line;
    return entry;
}

int main() {
    std::string raw = "2025-05-14T12:00:00Z INFO Service started";
    LogEntry entry = parseLogLine(raw);

    std::cout << "timestamp: " << entry.timestamp << '\n';
    std::cout << "level    : " << entry.level << '\n';
    std::cout << "message  : " << entry.message << '\n';
    return 0;
}